home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Fixation 1.3 / menus.c < prev    next >
Text File  |  1996-04-11  |  11KB  |  484 lines

  1. /*****
  2.  * menus.c
  3.  *
  4.  *
  5.  *****/
  6.  
  7. #include <string.h>
  8.  
  9. #include "mytypes.h"
  10. #include "ResRefs.h"
  11. #include "error.h"
  12.  
  13. #include "globals.h"
  14. #include "game.h"
  15. #include "outgoing.h"
  16. #include "menus.h"
  17. #include "tcpstuff.h"
  18. #include "connexions.h"
  19. #include "window.h"
  20. #include "main.h"
  21. #include "util.h"
  22. #include "preffile.h"
  23.  
  24. Style            gCurrentStyle = kPlainStyle;
  25. Boolean            gHasPopupControl;
  26.  
  27. /* Templates */
  28. void                 enable (MenuHandle menu, short item, short ok);
  29. void                SetUpMenus(void);
  30. void                HandleMenuChoice(long menuChoice);
  31. void                HandleAppleChoice(short item);
  32. void                HandleFileChoice(short item);
  33. void                 HandleEditChoice(short item);
  34. void                 HandleOptionChoice(short item);
  35. void                 HandleWindowChoice(short item);
  36. void                HandleFontChoice(short item);
  37. void                HandleSizeChoice(short item);
  38. void                HandleCommandsChoice(short item);
  39.  
  40. void SetUpMenus(void)
  41. {
  42.     Handle            menuBar;
  43.     MenuHandle        menu;
  44.     ControlHandle    control;
  45.     OSErr            myErr;
  46.     long            feature;
  47.     short nnn;
  48.     
  49.     menuBar = GetNewMBar(rMenuBar);                /* read menus into new menu list */
  50.     SetMenuBar(menuBar);                        /* set to the current menu list */
  51.     DisposHandle(menuBar);
  52.     
  53.     menuBar = GetNewMBar(kBaseResID);
  54.     SetMenuBar(menuBar);
  55.     
  56.     menu = GetMHandle(mApple);
  57.     AddResMenu(menu, 'DRVR');
  58.     
  59.     MenuHandle man = GetMHandle(mOption);
  60.     CheckItem(man, iSound, gPrefs.useSound);
  61.     CheckItem(man, iAutoFlag, gPrefs.autoFlag);
  62.  
  63.     menu = GetMenu(mFont);
  64.     InsertMenu(menu, -1);
  65.     AddResMenu(menu, 'FONT');
  66.     
  67.         // you wanna see ugly?  you wanna see?
  68.         // I'll show you ugly.
  69.     man = GetMHandle(mFont);
  70.     Str255 sting, ms;
  71.     GetFontName(gPrefs.currentFont, sting);
  72.     sting[sting[0]] = 0;
  73.     for (nnn=0;nnn<CountMItems(man);nnn++) {
  74.         GetItem(man, nnn, ms);
  75.         ms[ms[0]] = 0;
  76.         if (!strcmp((char *) ms, (char *) sting))
  77.             CheckItem(man, nnn, true);
  78.     }
  79.         // that shit worked first time.  unbelieveable.
  80.     
  81.     menu = GetMenu(mSize);
  82.     InsertMenu(menu, -1);
  83.     CheckItem(GetMHandle(mSize), gPrefs.currentSize - 6, true);
  84.     
  85.     DrawMenuBar();
  86.     
  87. //    HandleFontChoice(gLastFont);
  88. //    HandleSizeChoice(3);
  89.     
  90.     myErr = Gestalt(gestaltPopupAttr, &feature);
  91.     
  92.     gHasPopupControl = ((myErr == noErr) && (feature & (1 << gestaltPopupPresent)));
  93.     
  94.     if (gHasPopupControl)
  95.         control = GetNewControl(kBaseResID, FrontWindow());
  96. }
  97. /* end SetUpMenus */
  98.  
  99.  
  100. /****
  101.  *  AdjustMenus()
  102.  *
  103.  *    Enable or disable the items in the Edit menu if a DA window
  104.  *    comes up or goes away. Our application doesn't do anything with
  105.  *    the Edit menu.
  106.  *
  107.  ****/
  108.  
  109. void AdjustMenus(void)
  110. {    
  111.     MenuHandle fileMenu;
  112.     
  113.     fileMenu = GetMHandle(mFile);
  114.     enable(fileMenu, iOpen,  nexStatus[0] == kStatClosed);    
  115.     enable(fileMenu, iKillConn, nexStatus[0] != kStatClosed);    
  116.     enable(fileMenu, iClose, gGames != 0);    
  117. }
  118.  
  119. static void
  120. enable(MenuHandle menu, short item, short ok)
  121. {
  122.     if (ok)
  123.         EnableItem(menu, item);
  124.     else
  125.         DisableItem(menu, item);
  126. }
  127.  
  128.  
  129. /*****
  130.  * HandleMenu(mSelect)
  131.  *
  132.  *  handles the menu selections and disperses the choices to the correct functions.
  133.  *
  134.  *****/
  135.  
  136. void HandleMenu(long menuChoice)
  137. {
  138.     short    menu;
  139.     short    item;
  140.     
  141.     if(menuChoice !=0)
  142.     {
  143.         menu = HiWord(menuChoice);
  144.         item = LoWord(menuChoice);
  145.         
  146.         switch(menu)
  147.         {
  148.             case mApple:
  149.                 HandleAppleChoice(item);
  150.                 break;
  151.             case mFile:
  152.                 HandleFileChoice(item);
  153.                 break;
  154.             case mEdit:
  155.                 HandleEditChoice(item);
  156.                 break;
  157.             case mOption:
  158.                 HandleOptionChoice(item);
  159.                 break;
  160.             case mWindow:
  161.                 HandleWindowChoice(item);
  162.                 break;
  163.             case mFont:
  164.                 HandleFontChoice(item);
  165.                 break;
  166.             case mSize:
  167.                 HandleSizeChoice(item);
  168.                 break;
  169.             case mCommands:
  170.                 HandleCommandsChoice(item);
  171.                 break;
  172.             default:
  173.                 break;
  174.         }
  175.         HiliteMenu(0);
  176.     }
  177. }
  178.  
  179. void HandleAppleChoice(short item)
  180. {
  181.     MenuHandle    appleMenu;
  182.     Str255        accName;
  183.     short        accNumber;
  184.     GrafPtr        savePort;
  185.     
  186.     switch(item)
  187.     {
  188.         case iAbout:
  189.             Alert(rAboutAlrt, nil);
  190.             break;
  191.         default:
  192.             GetPort(&savePort);
  193.             appleMenu = GetMHandle(mApple);
  194.             GetItem(appleMenu, item, accName);
  195.             accNumber = OpenDeskAcc(accName);
  196.             SetPort(savePort);
  197.             break;
  198.     }
  199. }
  200.  
  201. void HandleFileChoice(short item)
  202. {    
  203.     switch (item) {
  204.         case iOpen:
  205.             if (nexStatus[0] == kStatClosed)
  206.                 OpenTalker();
  207.                 break;
  208.         case iKillConn:
  209.             if (nexStatus[0] != kStatClosed) {
  210.                 ReleaseStreams();
  211.                 tprintf("Connection closed.\r");
  212.                 }
  213.                 break;
  214.         case iClose:
  215.                 WindowPtr win = FrontWindow();
  216.                 if (win != myWindow)
  217.                     CloseGameWindow(win);
  218.                 break;
  219.         case iQuit:
  220.                 timeToQuit = true;
  221.                 break;
  222.             default: break;
  223.         }
  224. }
  225.  
  226. void HandleEditChoice(short item)
  227. {    
  228.     switch (item) {
  229.         case iCut:
  230.             TECut(myText);
  231.             ZeroScrap();
  232.             TEToScrap();
  233.             break;
  234.         case iCopy:
  235.             TECopy(myText);
  236.             ZeroScrap();
  237.             TEToScrap();
  238.             break;
  239.         case iPaste:
  240.             TEPaste(typeText);
  241.             break;
  242.         default: break;
  243.         }
  244. }
  245.  
  246. void HandleOptionChoice(short item)
  247. {
  248.     MenuHandle optionMenu;
  249.     
  250.     optionMenu = GetMHandle(mOption);
  251.     
  252.     switch (item) {
  253.         case iFlip:
  254.             DoFlip();
  255.             break;
  256.         case iSound:
  257.             gPrefs.useSound = !gPrefs.useSound;
  258.             CheckItem(optionMenu, iSound, gPrefs.useSound);
  259.             break;
  260.         case iAutoFlag:
  261.             gPrefs.autoFlag = !gPrefs.autoFlag;
  262.             CheckItem(optionMenu, iAutoFlag, gPrefs.autoFlag);
  263.             break;
  264.         case iPrefs:
  265.             PrefDialog();
  266.             break;
  267.         case iPrefs2:
  268.             PrefDialog2();
  269.             break;
  270.         default: break;
  271.     }
  272. }
  273.  
  274. static const char *hiddenString =
  275. "\rHidden Features:\r\
  276. • While playing or observing a game, hold down the option key to visually see the last move\r\
  277. • Use the Help and Del keys to scroll the text window up and down one line at a time\r\
  278. • In bughouse, click on pieces on right to place\r\
  279. • Use the up and down arrow keys to access a command history\r\
  280. • Hitting the escape key while dragging a piece will cancel the drag\r\r";
  281.  
  282. static const char *versionString =
  283. "\rVersion History:\r\
  284. • Version 1.3\r\
  285.   Better piece dragging (backgrounds while dragging), sounds for tells, fixed current version checking bug,\
  286.  new hidden feature, gansta egg\r\
  287. • Version 1.2\r\
  288.   Timeseal built in, automatic current version checking\r\
  289. • Version 1.13\r\
  290.   Fixed bug which would cause a rare buffer overflow error when using Timestamp\r\
  291. • Version 1.12\r\
  292.   Fixed Timestamp bug that would add an hour to your clock\r\
  293. • Version 1.11\r\
  294.   Timestamp built in\r\
  295. • Version 1.1\r\
  296.   Numerous bug fixes, resizeable windows, command menu, much more\r\
  297. • Version 1.0\r\
  298.   First release\r\r";
  299.  
  300. static const char *bugsString =
  301. "\rAbout Bugs & Suggestions:\r\
  302. Please check my web page or finger my account to make sure you have the latest version before mailing me \
  303. bugs and suggestions.  When reporting a bug, please don't say something like 'it \
  304. crashed once.'  I need more than that to help you.  Another request is to cut it out \
  305. with the reports of Fixation not working with wild 5 ;-j  (Read the online help if \
  306. this makes no sense.)\r\
  307. Known bugs:\r\
  308. • color bleeding in text window\r\
  309. • smaller than normal windows in bughouse are messed up\r\
  310. • multiple line tells etc. are not colored correctly in FICS -- I'm waiting for a server change on this one\r\
  311. • grow boxes redraw incorrectly\r\
  312. • when moves are taken back, last move is still shown\r\
  313. • there's a slight sound conflict with Norton Filesaver\r\
  314. • on a couple people's machines, Fixation won't work unless another TCP app is run first\r\
  315. If you can provide details, I might eventually be able to fix the bug.\r\
  316. Here is a list of suggestions I've already had or thought of myself, which obviates \
  317. the need to report them unless you wish to add detail:\r\
  318. firewall support, saving games locally, move lists, color options for higlighting, \
  319. display legal moves, logging server output, using patterns for square colors, \
  320. auto-close windows option, highlighting draw offer, \
  321. promote options, flip partner's board properly, time highlighting when clock running down.\r\
  322. I'm sure I'm forgetting some.  Just because I should do these things doesn't mean I \
  323. will, however.  My volunteer time is limited.\r\r";
  324.  
  325. void HandleWindowChoice(short item)
  326. {    
  327.     Game *game;
  328.     switch (item) {
  329.         case iNormalSize:
  330.             WindowPtr win = FrontWindow();
  331.             if (!win)
  332.                 return;
  333.             game = FindGameFromWindow(win);
  334.             if (!game)
  335.                 return;
  336.             short delta = 32 * 8 - game->boardRect.right;
  337.             SetGameWindowSize(game, delta);
  338.             break;
  339.         case iTextWind:
  340.             if (FrontWindow() == myWindow)
  341.                 SendBehind(myWindow, nil);
  342.             else
  343.                 SelectWindow(myWindow);
  344.             break;
  345.         case iGameWindOne:
  346.             game = gGames;
  347.             while (game) {
  348.                 if (game->isFirst)
  349.                     SelectWindow((WindowPtr) game->wind);
  350.                 game = game->next;
  351.             }
  352.             break;
  353.         case iGameWindTwo:
  354.             game = gGames;
  355.             while (game) {
  356.                 if (game->isSecond)
  357.                     SelectWindow((WindowPtr) game->wind);
  358.                 game = game->next;
  359.             }
  360.             break;
  361.         case iHidden:
  362.             tprintf("%s", hiddenString);
  363.             break;
  364.         case iBugsSuggestions:
  365.             tprintf("%s", bugsString);
  366.             break;
  367.         case iVersionHistory:
  368.             tprintf("%s", versionString);
  369.             break;
  370.         default: break;
  371.         }
  372. }
  373.  
  374. void HandleCommandsChoice(short item)
  375. {    
  376.     switch (item) {
  377.         case icHelp:
  378.             bprintf("help\n");
  379.             break;
  380.         case icCommandList:
  381.             bprintf("help commands\n");
  382.             break;
  383.         case icWho:
  384.             bprintf("who\n");
  385.             break;
  386.         case icHistory:
  387.             bprintf("history\n");
  388.             break;
  389.         case icFinger:
  390.             bprintf("finger\n");
  391.             break;
  392.         case icVariables:
  393.             bprintf("var\n");
  394.             break;
  395.         case icMessages:
  396.             bprintf("messages\n");
  397.             break;
  398.         case icClearMessages:
  399.             bprintf("clear\n");
  400.             break;
  401.         case icMore:
  402.             bprintf("more\n");
  403.             break;
  404.  
  405.         case icResign:
  406.             bprintf("resign\n");
  407.             break;
  408.         case icDraw:
  409.             bprintf("draw\n");
  410.             break;
  411.         case icAbort:
  412.             bprintf("abort\n");
  413.             break;
  414.         case icFlag:
  415.             bprintf("flag\n");
  416.             break;
  417.         case icMoretime60:
  418.             bprintf("moretime 60\n");
  419.             break;
  420.         default: break;
  421.         }
  422. }
  423.  
  424. TextStyle tempStyle = {0, 0, 0, 9, {0, 0, 0}};
  425.  
  426. void HandleFontChoice(short item)
  427. {
  428.     short    fontNumber, nnn;
  429.     Str255    fontName;
  430.     MenuHandle menuHandle;
  431.     
  432.     menuHandle = GetMHandle(mFont);
  433.     
  434.     for (nnn=0;nnn<CountMItems(menuHandle);nnn++)
  435.         CheckItem(menuHandle, nnn, nnn == item);
  436.  
  437.     GetItem(menuHandle, item, fontName);
  438.     GetFNum(fontName, &fontNumber);
  439.     
  440.     gPrefs.currentFont = fontNumber;
  441.  
  442.     SetPort(myWindow);
  443.     short oldstart = (**myText).selStart, oldend = (**myText).selEnd;
  444.     TESetSelect(0, 32767, myText);
  445.     
  446.     tempStyle.tsFont = gPrefs.currentFont;
  447.     TESetStyle(doFont, &tempStyle, true, myText);
  448.     TECalText(myText);
  449.     CalcVisLines();
  450.     CalcVBar();
  451.     
  452.     TESetSelect(oldstart, oldend, myText);
  453.  
  454. //    TextFont(gCurrentFont);
  455. //    SetUpWindow();
  456. }
  457.  
  458. void    HandleSizeChoice(short item)
  459. {
  460.     short    fontSize, nnn;
  461.     MenuHandle menuHandle;
  462.     
  463.     menuHandle = GetMHandle(mSize);
  464.     
  465.     for (nnn=0;nnn<CountMItems(menuHandle);nnn++)
  466.         CheckItem(menuHandle, nnn, nnn == item);
  467.     
  468.     fontSize = item + 6;  // Start the font size at 7 and go to 16
  469.     
  470.     gPrefs.currentSize = fontSize;
  471.  
  472.     SetPort(myWindow);
  473.     short oldstart = (**myText).selStart, oldend = (**myText).selEnd;
  474.     TESetSelect(0, 32767, myText);
  475.     
  476.     tempStyle.tsSize = gPrefs.currentSize;
  477.     TESetStyle(doSize, &tempStyle, true, myText);
  478.     TECalText(myText);
  479.     CalcVisLines();
  480.     CalcVBar();
  481.     
  482.     TESetSelect(oldstart, oldend, myText);
  483.     
  484. }